Next.js λμ μν¬νΈλ₯Ό λ§μ€ν°νμ¬ μ΅μ μ μ½λ λΆν μ λ¬μ±νμΈμ. κ³ κΈ μ λ΅μΌλ‘ μΉμ¬μ΄νΈ μ±λ₯ ν₯μ, μ¬μ©μ κ²½ν κ°μ , μ΄κΈ° λ‘λ μκ° λ¨μΆμ΄ κ°λ₯ν©λλ€.
Next.js λμ μν¬νΈ: κ³ κΈ μ½λ λΆν μ λ΅
νλ μΉ κ°λ°μμ λΉ λ₯΄κ³ λ°μμ±μ΄ λ°μ΄λ μ¬μ©μ κ²½νμ μ 곡νλ κ²μ λ§€μ° μ€μν©λλ€. μΈκΈ° μλ React νλ μμν¬μΈ Next.jsλ μΉμ¬μ΄νΈ μ±λ₯μ μ΅μ ννκΈ° μν νλ₯ν λꡬλ€μ μ 곡ν©λλ€. κ·Έμ€ κ°μ₯ κ°λ ₯ν κΈ°λ₯ μ€ νλλ μ½λ λΆν κ³Ό μ§μ° λ‘λ©(lazy loading)μ κ°λ₯νκ² νλ λμ μν¬νΈ(dynamic imports)μ λλ€. μ΄λ μ ν리μΌμ΄μ μ λ μμ μ²ν¬(chunk)λ‘ λλμ΄ νμν λλ§ λ‘λν μ μμμ μλ―Έν©λλ€. μ΄λ₯Ό ν΅ν΄ μ΄κΈ° λ²λ€ ν¬κΈ°λ₯Ό νκΈ°μ μΌλ‘ μ€μ¬ λ‘λ μκ°μ λ¨μΆνκ³ μ¬μ©μ μ°Έμ¬λλ₯Ό λμΌ μ μμ΅λλ€. μ΄ μ’ ν© κ°μ΄λμμλ Next.js λμ μν¬νΈλ₯Ό νμ©νμ¬ μ΅μ μ μ½λ λΆν μ λ¬μ±νκΈ° μν κ³ κΈ μ λ΅μ νμν΄ λ³΄κ² μ΅λλ€.
λμ μν¬νΈλ 무μμΈκ°?
νλ μλ°μ€ν¬λ¦½νΈμ νμ€ κΈ°λ₯μΈ λμ μν¬νΈλ λͺ¨λμ λΉλκΈ°μ μΌλ‘ κ°μ Έμ¬ μ μκ² ν΄μ€λλ€. νμΌ μλ¨μμ import
λ¬Έμ μ¬μ©νλ μ μ μν¬νΈμ λ¬λ¦¬, λμ μν¬νΈλ νλ‘λ―Έμ€(promise)λ₯Ό λ°ννλ import()
ν¨μλ₯Ό μ¬μ©ν©λλ€. μ΄ νλ‘λ―Έμ€λ κ°μ Έμ€λ €λ λͺ¨λλ‘ ν΄μ(resolve)λ©λλ€. Next.jsμ λ§₯λ½μμ μ΄λ μ»΄ν¬λνΈμ λͺ¨λμ μ΄κΈ° λ²λ€μ ν¬ν¨μν€λ λμ , νμμ λ°λΌ λ‘λν μ μκ² ν΄μ€λλ€. μ΄λ νΉν λ€μκ³Ό κ°μ κ²½μ°μ μ μ©ν©λλ€:
- μ΄κΈ° λ‘λ μκ° λ¨μΆ: μ΄κΈ° λ·°μ νμν μ½λλ§ λ‘λν¨μΌλ‘μ¨ λΈλΌμ°μ κ° λ€μ΄λ‘λνκ³ νμ±ν΄μΌ νλ μλ°μ€ν¬λ¦½νΈμ μμ μ΅μνν©λλ€.
- μ±λ₯ ν₯μ: μ€μνμ§ μμ μ»΄ν¬λνΈλ₯Ό μ§μ° λ‘λ©νμ¬ μ€μ λ‘ νμν΄μ§κΈ° μ κΉμ§ 리μμ€λ₯Ό μλΉνμ§ μλλ‘ ν©λλ€.
- μ‘°κ±΄λΆ λ‘λ©: μ¬μ©μ νλ, κΈ°κΈ° μ ν λλ κΈ°ν 쑰건μ λ°λΌ λ€λ₯Έ λͺ¨λμ λμ μΌλ‘ κ°μ Έμ¬ μ μμ΅λλ€.
Next.jsμμ λμ μν¬νΈμ κΈ°λ³Έ ꡬν
Next.jsλ React μ»΄ν¬λνΈμ ν¨κ» λμ μν¬νΈλ₯Ό κ°λ¨νκ² μ¬μ©ν μ μλλ‘ λ΄μ₯λ next/dynamic
ν¨μλ₯Ό μ 곡ν©λλ€. λ€μμ κΈ°λ³Έμ μΈ μμμ
λλ€:
import dynamic from 'next/dynamic';
const DynamicComponent = dynamic(() => import('../components/MyComponent'));
function MyPage() {
return (
This is my page.
);
}
export default MyPage;
μ΄ μμμμ MyComponent
λ DynamicComponent
κ° λ λλ§λ λλ§ λ‘λλ©λλ€. next/dynamic
ν¨μλ μ½λ λΆν κ³Ό μ§μ° λ‘λ©μ μλμΌλ‘ μ²λ¦¬ν©λλ€.
κ³ κΈ μ½λ λΆν μ λ΅
1. μ»΄ν¬λνΈ μμ€ μ½λ λΆν
κ°μ₯ μΌλ°μ μΈ μ¬μ© μ¬λ‘λ μ»΄ν¬λνΈ μμ€μμ μ½λλ₯Ό λΆν νλ κ²μ λλ€. μ΄λ λͺ¨λ¬ μ°½, ν λλ νμ΄μ§ νλ¨μ λνλλ μΉμ κ³Ό κ°μ΄ μ΄κΈ° νμ΄μ§ λ‘λ μ μ¦μ 보μ΄μ§ μλ μ»΄ν¬λνΈμ νΉν ν¨κ³Όμ μ λλ€. μλ₯Ό λ€μ΄, μν 리뷰λ₯Ό νμνλ μ μ μκ±°λ μΉμ¬μ΄νΈλ₯Ό μκ°ν΄ 보μΈμ. 리뷰 μΉμ μ λμ μΌλ‘ κ°μ Έμ¬ μ μμ΅λλ€:
import dynamic from 'next/dynamic';
const ProductReviews = dynamic(() => import('../components/ProductReviews'), {
loading: () => 리뷰 λ‘λ© μ€...
});
function ProductPage() {
return (
Product Name
Product description...
);
}
export default ProductPage;
loading
μ΅μ
μ μ»΄ν¬λνΈκ° λ‘λλλ λμ νλ μ΄μ€νλλ₯Ό μ 곡νμ¬ μ¬μ©μ κ²½νμ ν₯μμν΅λλ€. μ΄λ μ¬μ©μκ° λμ©λ μλ°μ€ν¬λ¦½νΈ λ²λ€ λ‘λ©μ μ§μ°μ κ²ͺμ μ μλ λ¨λ―Έλ μν리카 μΌλΆ μ§μκ³Ό κ°μ΄ μΈν°λ· μ°κ²°μ΄ λλ¦° μ§μμμ νΉν μ€μν©λλ€.
2. λΌμ°νΈ κΈ°λ° μ½λ λΆν
Next.jsλ μλμΌλ‘ λΌμ°νΈ κΈ°λ° μ½λ λΆν μ μνν©λλ€. pages
λλ ν 리μ κ° νμ΄μ§λ λ³λμ λ²λ€μ΄ λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μκ° νΉμ λΌμ°νΈλ‘ μ΄λν λ ν΄λΉ λΌμ°νΈμ νμν μ½λλ§ λ‘λλ©λλ€. μ΄κ²μ΄ κΈ°λ³Έ λμμ΄κΈ΄ νμ§λ§, μ ν리μΌμ΄μ
μ λμ± μ΅μ ννκΈ° μν΄ μ΄λ₯Ό μ΄ν΄νλ κ²μ΄ μ€μν©λλ€. νΉμ νμ΄μ§λ₯Ό λ λλ§νλ λ° νμνμ§ μμ ν¬κ³ λΆνμν λͺ¨λμ νμ΄μ§ μ»΄ν¬λνΈλ‘ κ°μ Έμ€λ κ²μ νΌνμΈμ. νΉμ μνΈ μμ©μ΄λ νΉμ 쑰건 νμμλ§ νμν κ²½μ° λμ μΌλ‘ κ°μ Έμ€λ κ²μ κ³ λ €νμΈμ.
3. μ‘°κ±΄λΆ μ½λ λΆν
λμ μν¬νΈλ μ¬μ©μ μμ΄μ νΈ, λΈλΌμ°μ μμ μ§μνλ κΈ°λ₯ λλ κΈ°ν νκ²½ μμΈμ λ°λΌ 쑰건λΆλ‘ μ¬μ©λ μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ νΉμ 컨ν μ€νΈμ λ°λΌ λ€λ₯Έ μ»΄ν¬λνΈλ λͺ¨λμ λ‘λν μ μμ΅λλ€. μλ₯Ό λ€μ΄, μ¬μ©μμ μμΉ(μ§λ¦¬ μμΉ API μ¬μ©)μ λ°λΌ λ€λ₯Έ μ§λ μ»΄ν¬λνΈλ₯Ό λ‘λνκ±°λ μ€λλ λΈλΌμ°μ μλ§ ν΄λ¦¬ν(polyfill)μ λ‘λν μ μμ΅λλ€.
import dynamic from 'next/dynamic';
function MyComponent() {
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
const DynamicComponent = dynamic(() => {
if (isMobile) {
return import('../components/MobileComponent');
} else {
return import('../components/DesktopComponent');
}
});
return (
);
}
export default MyComponent;
μ΄ μμλ μ¬μ©μκ° λͺ¨λ°μΌ κΈ°κΈ°λ₯Ό μ¬μ©νλμ§ μ¬λΆμ λ°λΌ λ€λ₯Έ μ»΄ν¬λνΈλ₯Ό λ‘λνλ λ°©λ²μ 보μ¬μ€λλ€. λ μ λ’°ν μ μλ ν¬λ‘μ€ λΈλΌμ°μ νΈνμ±μ μν΄ κ°λ₯ν κ²½μ° μ¬μ©μ μμ΄μ νΈ μ€λν λμ κΈ°λ₯ κ°μ§(feature detection)μ μ€μμ±μ λͺ μ¬νμΈμ.
4. μΉ μ컀 μ¬μ©νκΈ°
μ΄λ―Έμ§ μ²λ¦¬λ 볡μ‘ν κ³μ°κ³Ό κ°μ΄ κ³μ° μ§μ½μ μΈ μμ μ κ²½μ°, μΉ μ컀(Web Workers)λ₯Ό μ¬μ©νμ¬ μμ μ λ³λμ μ€λ λλ‘ μ€νλ‘λνμ¬ λ©μΈ μ€λ λκ° μ°¨λ¨λμ΄ UIκ° λ©μΆλ κ²μ λ°©μ§ν μ μμ΅λλ€. λμ μν¬νΈλ μΉ μ컀 μ€ν¬λ¦½νΈλ₯Ό νμμ λ°λΌ λ‘λνλ λ° μ€μν©λλ€.
import dynamic from 'next/dynamic';
function MyComponent() {
const startWorker = async () => {
const MyWorker = dynamic(() => import('../workers/my-worker'), {
ssr: false // μΉ μ컀μ μλ² μ¬μ΄λ λ λλ§ λΉνμ±ν
});
const worker = new (await MyWorker()).default();
worker.postMessage({ data: 'some data' });
worker.onmessage = (event) => {
console.log('Received from worker:', event.data);
};
};
return (
);
}
export default MyComponent;
ssr: false
μ΅μ
μ μ£Όλͺ©νμΈμ. μΉ μ컀λ μλ² μ¬μ΄λμμ μ€νλ μ μμΌλ―λ‘, λμ μν¬νΈμ λν΄ μλ² μ¬μ΄λ λ λλ§μ λΉνμ±νν΄μΌ ν©λλ€. μ΄ μ κ·Ό λ°©μμ μ μΈκ³μ μΌλ‘ μ¬μ©λλ κΈμ΅ μ ν리μΌμ΄μ
μμ λκ·λͺ¨ λ°μ΄ν° μΈνΈλ₯Ό μ²λ¦¬νλ κ²κ³Ό κ°μ΄ μ¬μ©μ κ²½νμ μ νμν¬ μ μλ μμ
μ μ μ©ν©λλ€.
5. λμ μν¬νΈ ν리νμΉ
λμ μν¬νΈλ μΌλ°μ μΌλ‘ νμν λ λ‘λλμ§λ§, μ¬μ©μκ° κ³§ νμν κ²μΌλ‘ μμλ λ 미리 κ°μ Έμ¬ μ μμ΅λλ€(prefetch). μ΄λ μ ν리μΌμ΄μ
μ μ²΄κ° μ±λ₯μ λμ± ν₯μμν¬ μ μμ΅λλ€. Next.jsλ λ§ν¬λ νμ΄μ§μ μ½λλ₯Ό 미리 κ°μ Έμ€λ prefetch
propκ³Ό ν¨κ» next/link
μ»΄ν¬λνΈλ₯Ό μ 곡ν©λλ€. κ·Έλ¬λ λμ μν¬νΈλ₯Ό ν리νμΉνλ €λ©΄ λ€λ₯Έ μ κ·Ό λ°©μμ΄ νμν©λλ€. μ΅μ React λ²μ μμ μ¬μ© κ°λ₯ν React.preload
APIλ₯Ό μ¬μ©νκ±°λ, Intersection Observer APIλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈκ° κ³§ 보μ΄κ² λ μμ μ κ°μ§νλ μ¬μ©μ μ μ ν리νμΉ λ©μ»€λμ¦μ ꡬνν μ μμ΅λλ€.
μμ (Intersection Observer API μ¬μ©):
import dynamic from 'next/dynamic';
import { useEffect, useRef } from 'react';
const DynamicComponent = dynamic(() => import('../components/MyComponent'));
function MyPage() {
const componentRef = useRef(null);
useEffect(() => {
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
// ν리νμΉλ₯Ό μν΄ μλμΌλ‘ μν¬νΈ νΈλ¦¬κ±°
import('../components/MyComponent');
observer.unobserve(componentRef.current);
}
});
},
{ threshold: 0.1 }
);
if (componentRef.current) {
observer.observe(componentRef.current);
}
return () => {
if (componentRef.current) {
observer.unobserve(componentRef.current);
}
};
}, []);
return (
My Page
);
}
export default MyPage;
μ΄ μμλ Intersection Observer APIλ₯Ό μ¬μ©νμ¬ DynamicComponent
κ° κ³§ 보μ΄κ² λ μμ μ κ°μ§ν λ€μ μν¬νΈλ₯Ό νΈλ¦¬κ±°νμ¬ μ½λλ₯Ό ν¨κ³Όμ μΌλ‘ ν리νμΉν©λλ€. μ΄λ μ¬μ©μκ° μ€μ λ‘ μ»΄ν¬λνΈμ μνΈ μμ©ν λ λ λΉ λ₯Έ λ‘λ© μκ°μΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
6. κ³΅ν΅ μμ‘΄μ± κ·Έλ£Ήν
μ¬λ¬ λμ μν¬νΈ μ»΄ν¬λνΈκ° κ³΅ν΅ μμ‘΄μ±μ 곡μ νλ κ²½μ°, ν΄λΉ μμ‘΄μ±μ΄ κ° μ»΄ν¬λνΈμ λ²λ€μ μ€λ³΅λμ§ μλλ‘ ν΄μΌ ν©λλ€. Next.jsμμ μ¬μ©νλ λ²λ€λ¬μΈ Webpackμ κ³΅ν΅ μ²ν¬λ₯Ό μλμΌλ‘ μλ³νκ³ μΆμΆν μ μμ΅λλ€. κ·Έλ¬λ μ²ν¬ λμμ λμ± μ΅μ ννλ €λ©΄ Webpack μ€μ (next.config.js
)μ ꡬμ±ν΄μΌ ν μλ μμ΅λλ€. μ΄λ UI μ»΄ν¬λνΈ λΌμ΄λΈλ¬λ¦¬λ μ νΈλ¦¬ν° ν¨μμ κ°μ΄ μ μμ μΌλ‘ μ¬μ©λλ λΌμ΄λΈλ¬λ¦¬μ νΉν κ΄λ ¨μ΄ μμ΅λλ€.
7. μ€λ₯ μ²λ¦¬
λ€νΈμν¬λ₯Ό μ¬μ©ν μ μκ±°λ μ΄λ€ μ΄μ λ‘ λͺ¨λμ λ‘λν μ μλ κ²½μ° λμ μν¬νΈκ° μ€ν¨ν μ μμ΅λλ€. μ ν리μΌμ΄μ
μ΄ μΆ©λνλ κ²μ λ°©μ§νκΈ° μν΄ μ΄λ¬ν μ€λ₯λ₯Ό μ μμ μΌλ‘ μ²λ¦¬νλ κ²μ΄ μ€μν©λλ€. next/dynamic
ν¨μλ₯Ό μ¬μ©νλ©΄ λμ μν¬νΈκ° μ€ν¨ν κ²½μ° νμλ μ€λ₯ μ»΄ν¬λνΈλ₯Ό μ§μ ν μ μμ΅λλ€.
import dynamic from 'next/dynamic';
const DynamicComponent = dynamic(() => import('../components/MyComponent'), {
loading: () => Loading...
,
onError: (error, retry) => {
console.error('μ»΄ν¬λνΈ λ‘λ μ€ν¨', error);
retry(); // μ νμ μΌλ‘ μν¬νΈ μ¬μλ
}
});
function MyPage() {
return (
);
}
export default MyPage;
onError
μ΅μ
μ μ¬μ©νλ©΄ μ€λ₯λ₯Ό μ²λ¦¬νκ³ μ μ¬μ μΌλ‘ μν¬νΈλ₯Ό μ¬μλν μ μμ΅λλ€. μ΄λ μΈν°λ· μ°κ²°μ΄ λΆμμ ν μ§μμ μ¬μ©μμκ² νΉν μ€μν©λλ€.
λμ μν¬νΈ μ¬μ©μ μν λͺ¨λ² μ¬λ‘
- λμ μν¬νΈ λμ μλ³: μ ν리μΌμ΄μ μ λΆμνμ¬ μ΄κΈ° νμ΄μ§ λ‘λμ μ€μνμ§ μμ μ»΄ν¬λνΈλ λͺ¨λμ μλ³νμΈμ.
- λ‘λ© μΈλμΌμ΄ν° μ¬μ©: μ»΄ν¬λνΈκ° λ‘λλλ λμ μ¬μ©μμκ² μκ°μ μ νΈλ₯Ό μ 곡νμΈμ.
- μ μμ μΈ μ€λ₯ μ²λ¦¬: μ ν리μΌμ΄μ μ΄ μΆ©λνμ§ μλλ‘ μ€λ₯ μ²λ¦¬λ₯Ό ꡬννμΈμ.
- μ²ν¬ μ΅μ ν: Webpackμ ꡬμ±νμ¬ μ²ν¬ λμμ μ΅μ ννκ³ κ³΅ν΅ μμ‘΄μ±μ΄ μ€λ³΅λλ κ²μ λ°©μ§νμΈμ.
- μ² μ ν ν μ€νΈ: λμ μν¬νΈκ° νμ±νλ μνμμ μ ν리μΌμ΄μ μ ν μ€νΈνμ¬ λͺ¨λ κ²μ΄ μμλλ‘ μλνλμ§ νμΈνμΈμ.
- μ±λ₯ λͺ¨λν°λ§: μ±λ₯ λͺ¨λν°λ§ λꡬλ₯Ό μ¬μ©νμ¬ λμ μν¬νΈκ° μ ν리μΌμ΄μ μ±λ₯μ λ―ΈμΉλ μν₯μ μΆμ νμΈμ.
- μλ² μ»΄ν¬λνΈ κ³ λ € (Next.js 13 μ΄μ): μ΅μ λ²μ μ Next.jsλ₯Ό μ¬μ©νλ€λ©΄, μλ²μμ λ λλ§ λ‘μ§μ μ²λ¦¬νκ³ ν΄λΌμ΄μΈνΈ μΈ‘ μλ°μ€ν¬λ¦½νΈ λ²λ€μ μ€μ΄λ μλ² μ»΄ν¬λνΈμ μ΄μ μ νμν΄ λ³΄μΈμ. μλ² μ»΄ν¬λνΈλ λ§μ κ²½μ° λμ μν¬νΈμ νμμ±μ μμ¨ μ μμ΅λλ€.
μ½λ λΆν λΆμ λ° μ΅μ νλ₯Ό μν λꡬ
μ½λ λΆν μ λ΅μ λΆμνκ³ μ΅μ ννλ λ° λμμ΄ λλ λͺ κ°μ§ λκ΅¬κ° μμ΅λλ€:
- Webpack Bundle Analyzer: μ΄ λꡬλ Webpack λ²λ€μ ν¬κΈ°λ₯Ό μκ°ννκ³ ν° μμ‘΄μ±μ μλ³νλ λ° λμμ μ€λλ€.
- Lighthouse: μ΄ λꡬλ μ½λ λΆν κΆμ₯ μ¬νμ ν¬ν¨νμ¬ μΉμ¬μ΄νΈ μ±λ₯μ λν ν΅μ°°λ ₯μ μ 곡ν©λλ€.
- Next.js Devtools: Next.jsλ μ ν리μΌμ΄μ μ μ±λ₯μ λΆμνκ³ κ°μ μμμ μλ³νλ λ° λμμ΄ λλ λ΄μ₯ κ°λ° λꡬλ₯Ό μ 곡ν©λλ€.
μ€μ μ¬μ© μ¬λ‘
- μ μ μκ±°λ μΉμ¬μ΄νΈ: μν 리뷰, κ΄λ ¨ μν λ° κ²°μ νλ¦μ λμ μΌλ‘ λ‘λν©λλ€. μ΄λ νΉν λλ¨μμμλ μν리카 μΌλΆ μ§μκ³Ό κ°μ΄ μΈν°λ· μλκ° λλ¦° μ§μμ μ¬μ©μμκ² μνν μΌν κ²½νμ μ 곡νλ λ° νμμ μ λλ€.
- λ΄μ€ μΉμ¬μ΄νΈ: μ΄λ―Έμ§μ λΉλμ€λ₯Ό μ§μ° λ‘λ©νκ³ , λκΈ μΉμ μ λμ μΌλ‘ λ‘λν©λλ€. μ΄λ₯Ό ν΅ν΄ μ¬μ©μλ ν° λ―Έλμ΄ νμΌμ΄ λ‘λλ λκΉμ§ κΈ°λ€λ¦¬μ§ μκ³ μ£Όμ μ½ν μΈ μ λΉ λ₯΄κ² μ‘μΈμ€ν μ μμ΅λλ€.
- μμ λ―Έλμ΄ νλ«νΌ: νΌλ, νλ‘ν λ° μ±ν μ°½μ λμ μΌλ‘ λ‘λν©λλ€. μ΄λ₯Ό ν΅ν΄ λ§μ μμ μ¬μ©μμ κΈ°λ₯μ΄ μμ΄λ νλ«νΌμ΄ λ°μμ±μ μ μ§ν μ μμ΅λλ€.
- κ΅μ‘ νλ«νΌ: λνν μ°μ΅ λ¬Έμ , ν΄μ¦ λ° λΉλμ€ κ°μλ₯Ό λμ μΌλ‘ λ‘λν©λλ€. μ΄λ₯Ό ν΅ν΄ νμλ€μ ν° μ΄κΈ° λ€μ΄λ‘λμ λΆλ΄μ λλΌμ§ μκ³ νμ΅ μλ£μ μ‘μΈμ€ν μ μμ΅λλ€.
- κΈμ΅ μ ν리μΌμ΄μ : 볡μ‘ν μ°¨νΈ, λ°μ΄ν° μκ°ν λ° λ³΄κ³ λꡬλ₯Ό λμ μΌλ‘ λ‘λν©λλ€. μ΄λ₯Ό ν΅ν΄ λΆμκ°λ€μ μ νλ λμνμμλ κΈμ΅ λ°μ΄ν°λ₯Ό μ μνκ² μ‘μΈμ€νκ³ λΆμν μ μμ΅λλ€.
κ²°λ‘
λμ μν¬νΈλ Next.js μ ν리μΌμ΄μ μ μ΅μ ννκ³ λΉ λ₯΄κ³ λ°μμ± μλ μ¬μ©μ κ²½νμ μ 곡νλ κ°λ ₯ν λꡬμ λλ€. μ½λλ₯Ό μ λ΅μ μΌλ‘ λΆν νκ³ νμμ λ°λΌ λ‘λν¨μΌλ‘μ¨ μ΄κΈ° λ²λ€ ν¬κΈ°λ₯Ό ν¬κ² μ€μ΄κ³ , μ±λ₯μ κ°μ νλ©°, μ¬μ©μ μ°Έμ¬λ₯Ό ν₯μμν¬ μ μμ΅λλ€. μ΄ κ°μ΄λμμ μ€λͺ ν κ³ κΈ μ λ΅μ μ΄ν΄νκ³ κ΅¬νν¨μΌλ‘μ¨ Next.js μ ν리μΌμ΄μ μ ν λ¨κ³ λ λ°μ μν€κ³ μ μΈκ³ μ¬μ©μμκ² μνν κ²½νμ μ 곡ν μ μμ΅λλ€. μ΅μ μ κ²°κ³Όλ₯Ό 보μ₯νκΈ° μν΄ μ ν리μΌμ΄μ μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§νκ³ νμμ λ°λΌ μ½λ λΆν μ λ΅μ μ‘°μ νλ κ²μ μμ§ λ§μΈμ.
λμ μν¬νΈλ κ°λ ₯νμ§λ§ μ ν리μΌμ΄μ μ 볡μ‘μ±μ λνλ€λ μ μ λͺ μ¬νμΈμ. μ΄λ₯Ό ꡬννκΈ° μ μ μ±λ₯ ν₯μκ³Ό 볡μ‘μ± μ¦κ° μ¬μ΄μ μ₯λ¨μ μ μ μ€νκ² κ³ λ €νμΈμ. λ§μ κ²½μ°, ν¨μ¨μ μΈ μ½λλ‘ μ μ€κ³λ μ ν리μΌμ΄μ μ λμ μν¬νΈμ ν¬κ² μμ‘΄νμ§ μκ³ λ μλΉν μ±λ₯ ν₯μμ λ¬μ±ν μ μμ΅λλ€. κ·Έλ¬λ ν¬κ³ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ°, λμ μν¬νΈλ μ°μν μ¬μ©μ κ²½νμ μ 곡νκΈ° μν νμ λꡬμ λλ€.
λν, μ΅μ Next.js λ° React κΈ°λ₯μ λν μ 보λ₯Ό νμ μ΅μ μνλ‘ μ μ§νμΈμ. μλ² μ»΄ν¬λνΈ(Next.js 13 μ΄μμμ μ¬μ© κ°λ₯)μ κ°μ κΈ°λ₯μ μλ²μμ μ»΄ν¬λνΈλ₯Ό λ λλ§νκ³ ν΄λΌμ΄μΈνΈμλ νμν HTMLλ§ μ μ‘νμ¬ μ΄κΈ° μλ°μ€ν¬λ¦½νΈ λ²λ€ ν¬κΈ°λ₯Ό νκΈ°μ μΌλ‘ μ€μμΌλ‘μ¨ λ§μ λμ μν¬νΈμ νμμ±μ μ μ¬μ μΌλ‘ λ체ν μ μμ΅λλ€. λμμμ΄ μ§ννλ μΉ κ°λ° κΈ°μ νκ²½μ λ§μΆ° μ κ·Ό λ°©μμ μ§μμ μΌλ‘ νκ°νκ³ μ‘°μ νμΈμ.